package controller

import (
	"bluebell/logic"
	"bluebell/models"
	"bluebell/utils"
	"errors"
	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator/v10"
	"go.uber.org/zap"
)

//SignUpHandler  注册处理Handle
// @Summary      用户注册接口
// @Tags         用户相关
// @Accept       json
// @Produce      json
// @Param        object  body  models.ParamSignUp  true  "用户注册信息"
// @Success      200  {object}   controller._ResponseSignup
// @Router       /signup [post]
func SignUpHandler(c *gin.Context) {
	//1、获取参数和校验参数
	p := new(models.ParamSignUp)
	if err := c.BindJSON(p); err != nil { //只有在前端传过来的字段类型与绑定的结构体字段类型不符时，才会报错
		zap.L().Error("注册接口参数检验出错", zap.Error(err))
		if errs, ok := err.(validator.ValidationErrors); !ok {
			utils.ResponseError(c, utils.CodeInvalidParam)
		} else {
			utils.ResponseErrorWithMsg(c, utils.CodeInvalidParam, errs.Translate(trans))
		}
		return
	}

	//2、业务处理
	if err := logic.SignUp(p); err != nil {
		zap.L().Error("注册接口出错", zap.Error(err))
		ok := errors.Is(err, utils.ErrorUserExist)
		if ok {
			utils.ResponseError(c, utils.CodeUserExist)
		} else {
			utils.ResponseErrorWithMsg(c, utils.CodeServerBusy, err.Error())
		}

		return
	}

	//3、返回成功响应
	utils.ResponseSuccess(c, nil)
}

//LoginHandler  登录处理Handler
// @Summary      用户登录接口
// @Tags         用户相关
// @Accept       json
// @Produce      json
// @Param        object body models.ParamLogin true "用户名和密码"
// @Success      200  {object}  controller._ResponseLogin
// @Router       /login [post]
func LoginHandler(c *gin.Context) {
	//1、获取参数和校验参数
	var loginUser models.ParamLogin
	if err := c.BindJSON(&loginUser); err != nil {
		zap.L().Error("登录接口参数检验出错", zap.Error(err))
		if errs, ok := err.(validator.ValidationErrors); !ok {
			utils.ResponseError(c, utils.CodeInvalidParam)
		} else {
			utils.ResponseErrorWithMsg(c, utils.CodeInvalidParam, errs.Translate(trans))
		}
		return
	}
	//2、业务处理
	err, token := logic.Login(&loginUser)
	if err != nil {
		zap.L().Error("登录接口业务处理出错", zap.String("当前用户名", loginUser.Username), zap.Error(err))
		if errors.Is(err, utils.ErrorUserNotExist) {
			utils.ResponseError(c, utils.CodeUserNotExist)
		} else if errors.Is(err, utils.ErrorInvalidPassword) {
			utils.ResponseError(c, utils.CodeInvalidPassword)
		} else {
			utils.ResponseErrorWithMsg(c, utils.CodeServerBusy, err.Error())
		}
		return
	}
	//3、返回响应
	utils.ResponseSuccess(c, map[string]interface{}{
		"token": token,
	})

}
